#include "png.h"
#include "zlib.h"


//下述代码无通道检测

void png_read(const char *file_path,struct png_info *pnginfo)
{
    png_structp png_ptr;
    png_infop info_ptr;
    int color_type = 0; 
    int image_size = 0;
	
    FILE *p_fp;
 
    if ((p_fp = fopen(file_path, "rb")) == NULL)
    {
        fprintf(stderr, "%s open fail!!!\n", file_path);
        return;
    }
 
    /* 创建一个png_structp结构体，如果不想自定义错误处理，后3个参数可以传NULL */
    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);	
    if (png_ptr == NULL)
    {
        fclose(p_fp);
        return;
    }
 
	/* 创建一个info_ptr，必须的 */	
    info_ptr = png_create_info_struct(png_ptr);
    
    if (info_ptr == NULL)
    {
        fclose(p_fp);
        png_destroy_read_struct(&png_ptr, NULL, NULL);
        return;
    }
 
    /* 如果上面png_create_read_struct没有自定义错误处理，这里是必须的 */
    if (setjmp(png_jmpbuf(png_ptr)))
    {
        png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
        fclose(p_fp);
 
        return;
    }
 
    /* 初始化文件IO */
	png_init_io(png_ptr, p_fp);
 
    /* 
     * 函数功能：读取png图片信息 
     * 说明：可以参数3来改变不同的读取方式，这里只读取RGB，抛弃了ALPHA
     */
    png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_ALPHA, NULL);
 
	if ((png_ptr != NULL) && (info_ptr != NULL))
	{
		/* 获取图像的宽高 */
		pnginfo->width = png_get_image_width(png_ptr, info_ptr);       
		pnginfo->height = png_get_image_height(png_ptr, info_ptr);
        pnginfo->bpp = png_get_bit_depth(png_ptr, info_ptr) * 3;
        int channels      = png_get_channels(png_ptr, info_ptr);
        printf("%d\n",channels);
		//printf("width:%d,height:%d\n", pnginfo->width, pnginfo->height);
 
        /* 获取图像颜色类型 */
	    color_type = png_get_color_type(png_ptr, info_ptr); 
        //printf("color type:%d\n", color_type);
 
    }
 
    /* 获取所有的图像数据 */
    png_bytep *row_pointers; /* 指针数组，数组中的每一个指针都指向一行图像数据 */
    row_pointers = png_get_rows(png_ptr, info_ptr);
    
    int i, j;
    int pos = 0;
 
	/* RGB格式 */
    if(PNG_COLOR_TYPE_RGB == color_type)
    {
        /* 图像数据的大小 */
        image_size = pnginfo->width * pnginfo->height * 3;   
        pnginfo->rgb = malloc(image_size);
 
        for(i = 0; i < pnginfo->height; i++)
        {
            for(j = 0; j < (pnginfo->width * 3); j += 3)
            {
                *(pnginfo->rgb + pos++) = row_pointers[i][j + 2];
                *(pnginfo->rgb + pos++) = row_pointers[i][j + 1];
                *(pnginfo->rgb + pos++) = row_pointers[i][j + 0];
            }
        }
 
    }   
 
    /* 清理图像，释放内存 */
    png_destroy_read_struct(&png_ptr, &info_ptr, 0);
    
    fclose(p_fp);    
    
    return;
}